package com.leyou.page.service;

import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exceptions.LyException;
import com.leyou.item.client.ItemClient;
import com.leyou.item.dto.BrandDTO;
import com.leyou.item.dto.CategoryDto;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author syf
 * @version 1.0
 * @date 2019/08/09 20:21
 * @Description TODO:
 */
@Service
public class PageService {

    @Autowired
    private ItemClient itemClient;

    @Value("${ly.static.itemDir}")
    private String itemDir;

    @Value("${ly.static.itemTemplate}")
    private String itemTemplate;

    @Autowired
    private SpringTemplateEngine springTemplateEngine;

    //Thymeleaf生成静态页中的第二步：TemplateResolver：模板解析器
    public void createHtml(Long id) {
        //上下文，准备数据
        Context context = new Context();
        //调用之前写好的加载数据方法
        context.setVariables(loadItemData(id));
        //创建静态页面存放地址
        File dirFile = new File(itemDir);
        //创建文件对象
        File itemFile = new File(dirFile, id + ".html");
        //创建打印写入流，来指定把静态页面放在哪里，把流放入try中可以以不用手动关闭，自己会关
        try (PrintWriter printWrite = new PrintWriter(itemFile)) {
            //调用方法
            springTemplateEngine.process(itemTemplate, context, printWrite);
        } catch (Exception e) {
            //文件写入失败
            throw new LyException(ExceptionEnum.FILE_WRITER_ERROR);
        }
    }

    //Thymeleaf生成静态页中的第一步：Context：运行上下文
    public Map<String, Object> loadItemData(Long id) {

        //查询spuDTO
        SpuDTO spuDTO = itemClient.findSpuIdBySpu(id);
        //根据上面查询结果中的spuId查询brand对象
        BrandDTO brandDTO = itemClient.findBrandById(spuDTO.getBrandId());
        //根据上面查询结果中的spuId查询categories对象集合
        List<CategoryDto> categoryDtos = itemClient.findListById(spuDTO.getCategoryIds());
        //查询规格组和组内的参数
        List<SpecGroupDTO> group = itemClient.findGroupByCidWithParams(spuDTO.getCid3());
        Map<String,Object> map=new HashMap<>();
        map.put("categories",categoryDtos); //categories        Category对象
        map.put("brand",brandDTO);//brand.name              Brand
        map.put("spuName",spuDTO.getName());//spuName               SpuDTO
        map.put("subTitle",spuDTO.getSubTitle());//subTitle             SpuDTO
        map.put("detail",spuDTO.getSpuDetail());//detail.description     SpuDTO
        map.put("skus",spuDTO.getSkus());//skus                     SpuDTO
        map.put("specs",group);//specs  [SpecGroupDTO,SpecGroupDTO]
        return map;
    }


    //删除静态页面
    public void removeHtml(Long id) {
        //创建静态页面存放的文件地址对象
        File dirFile=new File(itemDir);
        //创建静态页面文件对象
        File itemFile=new File(dirFile,id+".html");
        //删除文件
        if (itemFile.exists()) {
            itemFile.delete();
        }
    }
}
